Zurück in Fortgeschrittene ProgrammentwicklungWeiter in Fortgeschrittene ProgrammentwicklungBeispiel Zwischenresultate Zusammenfassung ?

Die Arbeitsmappe LZwischenresultate.xls illustriert das Arbeiten mit Auflistungen. Das Bild unten zeigt die Benutzerschnittstelle. Die Aufgabe lautet:

a) Schreiben Sie ein Programm, ...

b) Schreiben Sie ein Programm, das die Position des Tabellenblatts "Zwischenresultate"

In Aufgabe a) muss zuerst getestet werden, ob das Tabellenblatt Zwischenresultate bereits existiert oder nicht. Man durchläuft dazu alle Elemente der Worksheets-Auflistung und vergleicht deren Namen mit dem vorgegebenen. Als Schleife eignet sich die For ... Next-Schleife. Sie bricht ab, wenn die Zählvariable den Wert der Eigenschaft Count erreicht.

Dim i As Integer               'Laufvariable
Dim BlattGefunden As Boolean   'mit False initialisiert

For i = 1 To Worksheets.Count
  If Worksheets.Item(i).Name = "Zwischenresultate" Then
    BlattGefunden = True
  End If
Next i

Worksheets.Item(i) gibt das i-te Objekt der Auflistung zurück. Möglich ist auch der Zugriff über den Objektnamen, zum Beispiel Worksheets.Item("XY"). Die uns bereits begegneten Anweisungen Worksheets(i) bzw. Worksheets("XY") sind Kurzformen für den Aufruf der Item-Methode.

Für das Durchlaufen von Auflistungen stellt Visual Basic einen speziellen Schleifentyp zur Verfügung, die For Each ... Next-Schleife (vgl. Aufgabe Objektterminologie und VBA). Die Laufvariable enthält bei diesem Schleifentyp direkt das Objekt und nicht eine Nummer oder einen Namen. Mit der For Each ... Next-Schleife kann der obere Programmteil wie folgt geschrieben werden. Laufvariable ist die Variable Tabellenblatt vom Datentyp Worksheet.

Dim Tabellenblatt As Worksheet        'Laufvariable
Dim BlattGefunden As Boolean          'mit False initialisiert

For Each Tabellenblatt In Worksheets  'DURCHLAUFE ALLE Objekte IN der Auflistung
  If Tabellenblatt.Name = "Zwischenresultate" Then
    BlattGefunden = True
  End If
Next Tabellenblatt

Das Resultat der beiden Programmvarianten ist dasselbe. Die Variable BlattGefunden enthält True, falls das Tabellenblatt Zwischenresultate existiert und sonst False. Bei False soll nun gemäss Aufgabe a) das Blatt erstellt und hinzugefügt und bei True aus der Auflistung entfernt werden.

If BlattGefunden = False Then
  Worksheets.Add.Name = "Zwischenresultate"
Else
  Worksheets.Item("Zwischenresultate").Delete
End If

Die Anweisung Worksheets.Add erstellt ein neues Objekt und gibt es zurück. Noch in derselben Zeile wird anschliessend die Name-Eigenschaft des neuen Objekts auf Zwischenresultate gesetzt. Die Lösch-Anweisung verläuft ähnlich. Worksheets.Item("Zwischenresultate") gibt das Objekt zurück, das gelöscht werden soll, und die Delete-Methode führt die Löschoperation aus. Beachten Sie, dass nicht die Lösch-Methode der Auflistung (Worksheets.Delete) zur Anwendung kommt, da diese die Auflistung selbst löschen würde.

Um ein Tabellenblatt in einer Tabellenblatt-Auflistung neu zu positionieren (Aufgabe b), bieten die Worksheet-Objekte die Move-Methode an. Als Argument nimmt die Methode das Objekt entgegen, hinter bzw. vor dem das Objekt liegen soll. Die Anweisungen

Worksheets("XY").Move After:=Worksheets(3) bzw.
Worksheets("XY").Move Before:=Worksheets(3)

positionieren zum Beispiel das Tabellenblatt XY neu hinter bzw. vor dem Blatt, das zur Zeit an dritter Position ist. After und Before sind benannte Argumente. Da es keine Lücken in den Indizes geben darf, müssen gewisse Tabellenblätter bei einer solchen Operation zwangsweise neu nummeriert werden.

Um ein Objekt in einer Auflistung mit der Move-Methode um eine Position zu verschieben, muss seine aktuelle Position bekannt sein. Die Objekte einer Auflistung merken sich ihre Positionen in ihren Index-Eigenschaften. Die Anweisung

MeinePosition = Worksheets("XY").Index

schreibt zum Beispiel die Position (etwa 3) des Tabellenblatts XY in die Variable MeinePosition. Existiert das Objekt XY nicht, so wird ein Laufzeitfehler ausgegeben!

In Aufgabe b) muss der Verschiebe-Algorithmus wieder die Elemente der Auflistung durchlaufen, um sicherzustellen, dass das Arbeitsblatt "Zwischenresultate" existiert. Existiert das Objekt und befindet es sich nicht bereits ganz rechts bzw. ganz links, so lässt sich seine neue Position leicht aus seiner alten berechnen. Das Programm zum Verschieben nach rechts sieht damit folgendermassen aus.

Dim Blatt As Worksheet        'Laufvariable

For Each Blatt In Worksheets
  If Blatt.Name = "Zwischenresultate" Then
    If Blatt.Index < Worksheets.Count Then
      Blatt.Move After:=Worksheets(Blatt.Index + 1)
      Exit For
    End If
  End If
Next Tabellenblatt

Aufgabe Move-Methode
Aufgabe For Each ... Next-Schleife
Aufgabe Übungsaufgabe "kleine Helfer"

©abo